/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package model.fornecedor;

import java.util.List;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceException;
import model.excecoes.ErroDAOException;
import model.excecoes.ErroNegocioException;
import model.interfaces.INegocioFornecedor;
import model.factory.Factory;

/**
 *
 * @author Marcos
 */
public class NegocioFornecedor implements INegocioFornecedor {
    
    private RepositorioFornecedor repFornecedor = null;
    
    public NegocioFornecedor() {
        repFornecedor = Factory.getFornecedorDAO();
    }
    
    private boolean verificarExistencia(String cnpj, String razaoSocial) throws ErroDAOException, PersistenceException, NoResultException {
        return repFornecedor.verificarExistencia(razaoSocial, cnpj);
    }
    
    @Override
    public void cadastrarFornecedor(Fornecedor fornecedor) throws ErroDAOException, PersistenceException, NoResultException, ErroNegocioException {
        if (verificarExistencia(fornecedor.getCnpj(), fornecedor.getRazaoSocial())) {
            throw new ErroNegocioException("Fornecedor já cadastrado.\nPor favor insira os dados corretos ou cancele a operação.");
        }
        
        if (fornecedor.getRazaoSocial().length() > 300) {
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo Razão Social só aceita até 300 caracteres.");
        }
        
        if (fornecedor.getEndereco().getRua().length() > 300) {
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo Razão Social só aceita até 300 caracteres.");
        }
        
        if (fornecedor.getEndereco().getCidade().length() > 200) {
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo Cidade só aceita até 200 caracteres.");
        }
        
        if (fornecedor.getEndereco().getBairro().length() > 100) {
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo Bairro só aceita até 100 caracteres.");
        }
        
        if (fornecedor.getEndereco().getCep().length() > 20) {
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo Razão Social só aceita até 300 caracteres.");
        }
        
        if (fornecedor.getEndereco().getComplemento().length() > 300) {
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo Complemento só aceita até 300 caracteres.");
        }
        
        if (fornecedor.getEndereco().getUf().length() > 70) {
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo UF só aceita até 70 caracteres.");
        }
        
        if (fornecedor.getCnpj().length() > 20) {
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo CNPJ só aceita até 30 caracteres.");
        }
        
        if (fornecedor.getContato().getTelefone().length() > 30) {
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo Telefone só aceita até 30 caracteres.");
        }
        
        if (fornecedor.getContato().getCelular().length() > 30) {
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo Celular só aceita até 30 caracteres.");
        }
        
        if (fornecedor.getContato().getEmail().length() > 100) {
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo E-Mail só aceita até 100 caracteres.");
        }
        
        if(!fornecedor.getContato().getEmail().contains("@") || !fornecedor.getContato().getEmail().contains(".")){
            throw new ErroNegocioException("Formato inválido de E-Mail. Por favor coloque o endereço no seguinte formato:\n pessoa@people.com");
        }
        
        repFornecedor.cadastrar(fornecedor);
    }
    
    @Override
    public void alterarFornecedor(Fornecedor fornecedor) throws ErroDAOException, PersistenceException, NoResultException, ErroNegocioException {
        
        if(verificarExistencia(fornecedor.getCnpj(), fornecedor.getRazaoSocial()) == false){
            throw new ErroNegocioException("Os dados do Fornecedor não foram encontrados.\nPor favor informe os dados corretos ou cancele a operação.");
        }
        
        if (fornecedor.getRazaoSocial().length() > 300) {
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo Razão Social só aceita até 300 caracteres.");
        }
        
        if (fornecedor.getEndereco().getRua().length() > 300) {
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo Razão Social só aceita até 300 caracteres.");
        }
        
        if (fornecedor.getEndereco().getCidade().length() > 200) {
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo Cidade só aceita até 200 caracteres.");
        }
        
        if (fornecedor.getEndereco().getBairro().length() > 100) {
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo Bairro só aceita até 100 caracteres.");
        }
        
        if (fornecedor.getEndereco().getCep().length() > 20) {
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo Razão Social só aceita até 300 caracteres.");
        }
        
        if (fornecedor.getEndereco().getComplemento().length() > 300) {
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo Complemento só aceita até 300 caracteres.");
        }
        
        if (fornecedor.getEndereco().getUf().length() > 70) {
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo UF só aceita até 70 caracteres.");
        }
        
        if (fornecedor.getCnpj().length() > 20) {
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo CNPJ só aceita até 30 caracteres.");
        }
        
        if (fornecedor.getContato().getTelefone().length() > 30) {
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo Telefone só aceita até 30 caracteres.");
        }
        
        if (fornecedor.getContato().getCelular().length() > 30) {
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo Celular só aceita até 30 caracteres.");
        }
        
        if (fornecedor.getContato().getEmail().length() > 100) {
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo E-Mail só aceita até 100 caracteres.");
        }
        
        if(!fornecedor.getContato().getEmail().contains("@") || !fornecedor.getContato().getEmail().contains(".")){
            throw new ErroNegocioException("Formato inválido de E-Mail. Por favor coloque o endereço no seguinte formato:\n pessoa@people.com");
        }
        
        repFornecedor.alterar(fornecedor);
    }
    
    @Override
    public void excluirFornecedor(Fornecedor fornecedor) throws ErroDAOException, PersistenceException, NoResultException, ErroNegocioException {
        
        if(verificarExistencia(fornecedor.getCnpj(), fornecedor.getRazaoSocial()) == false){
            throw new ErroNegocioException("Os dados do Fornecedor não foram encontrados.\nPor favor informe os dados corretos ou cancele a operação.");
        }
        
        repFornecedor.excluir(fornecedor);
    }
    
    @Override
    public List<Fornecedor> listarFornecedor(String consulta, String campo) throws ErroDAOException, PersistenceException, NoResultException, ErroNegocioException {
        List<Fornecedor> fornecedores = repFornecedor.listarFornecedor(consulta, campo);
        
        if(!consulta.equals("Todos") && !campo.equals("Todos")){
            if(fornecedores.isEmpty()){
                throw new ErroNegocioException("Os dados do Fornecedor não foram encontrados ou cadastrados. Por favor informe os dados corretos ou cancele a operação.");
            }
        }
        
        return fornecedores;
    }
    
}
